package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.dto.ChatFriendRequestDTO;
import com.zenithmind.chat.pojo.entity.ChatFriend;
import com.zenithmind.chat.pojo.vo.ChatFriendVO;
import com.zenithmind.common.result.PageResult;

import java.util.List;

/**
 * 好友关系服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatFriendService extends IService<ChatFriend> {

    /**
     * 分页查询好友列表
     * 
     * @param userId 用户ID
     * @param groupName 分组名称
     * @param keyword 搜索关键词
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    PageResult<ChatFriendVO> getFriendPage(String userId, String groupName, String keyword, 
                                          Integer pageNum, Integer pageSize);

    /**
     * 获取用户好友列表
     * 
     * @param userId 用户ID
     * @param status 关系状态
     * @return 好友列表
     */
    List<ChatFriendVO> getUserFriends(String userId, Integer status);

    /**
     * 根据ID获取好友信息
     * 
     * @param userId 用户ID
     * @param friendId 好友ID
     * @return 好友信息
     */
    ChatFriendVO getFriendById(String userId, String friendId);

    /**
     * 发送好友申请
     * 
     * @param requestDTO 申请DTO
     * @param userId 申请人ID
     * @return 申请ID
     */
    String sendFriendRequest(ChatFriendRequestDTO requestDTO, String userId);

    /**
     * 处理好友申请
     * 
     * @param requestId 申请ID
     * @param accept 是否接受
     * @param responseMessage 回复消息
     * @param userId 处理人ID
     * @return 是否成功
     */
    Boolean handleFriendRequest(String requestId, Boolean accept, String responseMessage, String userId);

    /**
     * 删除好友
     * 
     * @param friendId 好友ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean deleteFriend(String friendId, String userId);

    /**
     * 拉黑好友
     * 
     * @param friendId 好友ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean blockFriend(String friendId, String userId);

    /**
     * 取消拉黑
     * 
     * @param friendId 好友ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unblockFriend(String friendId, String userId);

    /**
     * 更新好友备注
     * 
     * @param friendId 好友ID
     * @param remarkName 备注名称
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean updateFriendRemark(String friendId, String remarkName, String userId);

    /**
     * 更新好友分组
     * 
     * @param friendId 好友ID
     * @param groupName 分组名称
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean updateFriendGroup(String friendId, String groupName, String userId);

    /**
     * 设置好友置顶
     * 
     * @param friendId 好友ID
     * @param isTop 是否置顶
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean setFriendTop(String friendId, Boolean isTop, String userId);

    /**
     * 设置消息免打扰
     * 
     * @param friendId 好友ID
     * @param isDisturbFree 是否免打扰
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean setDisturbFree(String friendId, Boolean isDisturbFree, String userId);

    /**
     * 搜索用户
     * 
     * @param keyword 搜索关键词
     * @param userId 当前用户ID
     * @param limit 限制数量
     * @return 用户列表
     */
    List<ChatFriendVO> searchUsers(String keyword, String userId, Integer limit);

    /**
     * 获取好友分组列表
     * 
     * @param userId 用户ID
     * @return 分组列表
     */
    List<String> getFriendGroups(String userId);

    /**
     * 检查是否为好友关系
     * 
     * @param userId 用户ID
     * @param friendId 好友ID
     * @return 是否为好友
     */
    Boolean checkIsFriend(String userId, String friendId);

    /**
     * 检查是否被拉黑
     * 
     * @param userId 用户ID
     * @param friendId 好友ID
     * @return 是否被拉黑
     */
    Boolean checkIsBlocked(String userId, String friendId);

    /**
     * 获取好友申请列表
     * 
     * @param userId 用户ID
     * @param type 类型（sent-发送的，received-接收的）
     * @param status 状态
     * @return 申请列表
     */
    List<Object> getFriendRequests(String userId, String type, Integer status);

    /**
     * 统计好友数量
     * 
     * @param userId 用户ID
     * @param status 关系状态
     * @return 好友数量
     */
    Integer countFriends(String userId, Integer status);
}
